<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\library\Sms as Smslib;
use app\common\model\User;

/**
 * 手机短信接口
 */
class Sms extends Api
{
    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';

    /**
     * @ApiTitle    (发送验证码)
     * @ApiAuthor   (Zhenzh)
     * @ApiDateTime (2019/10/18 10:27)
     * @ApiSummary  (描述)
     * @ApiBody  (Body)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/sms/send)
     * @ApiParams   (name="mobile", type="string", required=true, description="手机号", sample="")
     * @ApiParams   (name="event", type="string", required=true, description="事件名称 mobileLogin=手机号登录 resetPwd=重置密码 changeMobile=修改手机号", sample="mobileLogin")
     * @ApiReturnParams   (name="code", type="integer", required=true, description="状态码 1正常 0错误", sample="1")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回", sample="")
     * @ApiReturn ({
    "code": 1,
    "msg": "发送成功",
    "time": "1571380782",
    "data": null
    })
     */
    public function send()
    {
        $mobile = $this->request->request("mobile");
        $event = $this->request->request("event");
        $event = $event ? $event : 'register';

        if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('手机号不正确'));
        }
        $last = Smslib::get($mobile, $event);
        if ($last && time() - $last['createtime'] < 60) {
            $this->error(__('发送频繁'));
        }
        $ipSendTotal = \app\common\model\Sms::where(['ip' => $this->request->ip()])->whereTime('createtime', '-1 hours')->count();
        if ($ipSendTotal >= 5) {
            $this->error(__('发送频繁'));
        }
        $userinfo = User::getByMobile($mobile);
        if ($event == 'register' && $userinfo) {
            $this->error(__('已被注册'));
        } elseif (in_array($event, ['bindMobile', 'changeMobile']) && $userinfo) {
            $this->error(__('已被占用'));
        } elseif (in_array($event, ['changePwd', 'resetPwd', 'mobileLogin']) && !$userinfo) {
            $this->error(__('未注册'));
        }
        $code = mt_rand(1000, 9999);
        $ret = Smslib::send($mobile, $code, $event);
        if ($ret) {
            $this->success(__('发送成功'), config('app_debug') ? ['code' => $code] : null);
        } else {
            $this->error(__('发送失败'));
        }
    }

    /**
     * @ApiTitle    (检测验证码)
     * @ApiAuthor   (Zhenzh)
     * @ApiDateTime (2019/10/18 10:27)
     * @ApiSummary  (描述)
     * @ApiBody  (Body)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/sms/send)
     * @ApiParams   (name="mobile", type="string", required=true, description="手机号", sample="")
     * @ApiParams   (name="event", type="string", required=true, description="事件名称 mobilelogin=手机号登录 resetpwd=重置密码 changemobile=修改手机号", sample="mobilelogin")
     * @ApiReturnParams   (name="code", type="integer", required=true, description="状态码 1正常 0错误", sample="1")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回", sample="")
     * @ApiReturn ({
    "code": 1,
    "msg": "成功",
    "time": "1571381717",
    "data": null
    })
     */
    public function check()
    {
        $mobile = $this->request->request("mobile");
        $event = $this->request->request("event");
        $event = $event ? $event : 'register';
        $captcha = $this->request->request("captcha");

        if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('手机号不正确'));
        }
        if ($event) {
            $userinfo = User::getByMobile($mobile);
            if ($event == 'register' && $userinfo) {
                //已被注册
                $this->error(__('已被注册'));
            } elseif (in_array($event, ['changeMobile']) && $userinfo) {
                //被占用
                $this->error(__('已被占用'));
            } elseif (in_array($event, ['changePwd', 'resetPwd', 'mobileLogin']) && !$userinfo) {
                //未注册
                $this->error(__('未注册'));
            }
        }
        $ret = Smslib::check($mobile, $captcha, $event);
        if ($ret) {
            $this->success(__('成功'));
        } else {
            $this->error(__('验证码不正确'));
        }
    }
}
